package com.designpattern.structure.proxy.active;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**  
 * @author chengze
 * @date 2022/12/2
 * @desc 实现动态代理
 *       动态在哪了呢？持有的被代理对象是一个泛型类，不同于静态代理类直接指定了类型
 *       通过handler获取代理对象后，所有的方法都是通过invoke调用的，对方法的增强就可以放在这里面
 *       要注意的是，被代理类的所有方法都会被增强
 */
@Slf4j
public class BizInvocationHandler<T> implements InvocationHandler {

    /**
     * invocationHandler持有的被代理对象
     */
    T target;

    public BizInvocationHandler(T target) {
        this.target = target;
    }

    /**
     * proxy:代表动态代理对象
     * method：代表正在执行的方法
     * args：代表调用目标方法时传入的实参
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(target, args);
        log.info("对所有代理方法进行增强~");
        return null;
    }
}
